// 引入依赖
const { Sequelize, DataTypes } = require('sequelize');

// --------------------------
// 1. 数据库配置（请根据你的实际环境修改）
// --------------------------
const dbConfig = {
    dialect: 'mysql',
    host: 'localhost',    // 数据库地址（默认本地）
    port: 3306,           // 数据库端口（默认3306）
    username: 'root',     // 数据库用户名（替换为你的）
    password: 'root',   // 数据库密码（替换为你的）
    database: 'demo_db',  // 数据库名称（需提前手动创建，或开启下面的自动创建）
    logging: false        // 是否打印 SQL 日志（调试时可设为 console.log）
};

// --------------------------
// 2. 初始化 Sequelize 实例
// --------------------------
const sequelize = new Sequelize(
    dbConfig.database,
    dbConfig.username,
    dbConfig.password,
    {
        host: dbConfig.host,
        port: dbConfig.port,
        dialect: dbConfig.dialect,
        logging: dbConfig.logging,
        pool: {
            max: 5,          // 连接池最大连接数
            min: 0,          // 最小连接数
            acquire: 30000,  // 获取连接超时时间（毫秒）
            idle: 10000      // 连接空闲超时时间（毫秒）
        }
    }
);

// --------------------------
// 3. 定义数据模型（以 User 表为例）
// --------------------------
const User = sequelize.define('User', {
    // 字段定义
    username: {
        type: DataTypes.STRING(50),    // 字符串类型，长度50
        allowNull: false,              // 不允许为 null
        unique: true,                  // 唯一约束（用户名不可重复）
        comment: '用户名'              // 字段注释
    },
    age: {
        type: DataTypes.INTEGER,       // 整数类型
        allowNull: true,               // 允许为 null
        validate: {
            min: 0,                      // 年龄最小为0
            max: 150                     // 年龄最大为150
        },
        comment: '年龄'
    },
    email: {
        type: DataTypes.STRING(100),   // 字符串类型，长度100
        allowNull: true,
        validate: {
            isEmail: true                // 自动验证邮箱格式
        },
        comment: '邮箱'
    },
    status: {
        type: DataTypes.TINYINT,       // 小整数类型（0-255）
        defaultValue: 1,               // 默认值 1（1=正常，0=禁用）
        comment: '状态（1=正常，0=禁用）'
    }
}, {
    tableName: 'users',              // 数据库表名（默认会自动加 s，这里手动指定）
    timestamps: true,                // 自动添加 createdAt（创建时间）和 updatedAt（更新时间）
    paranoid: true,                  // 软删除（添加 deletedAt 字段，不会真正删除数据）
    underscored: true                // 字段名使用下划线（如 user_name 而非 userName）
});

// --------------------------
// 4. 数据库连接与模型同步
// --------------------------
async function initDB() {
    try {
        // 测试数据库连接
        await sequelize.authenticate();
        console.log('✅ 数据库连接成功！');

        // 同步模型到数据库（创建表）
        // force: false → 表存在则不删除；force: true → 每次运行都删除旧表重建（谨慎使用）
        await sequelize.sync({ force: false });
        console.log('✅ 数据库模型同步完成（表已创建/验证）！\n');
    } catch (error) {
        console.error('❌ 数据库初始化失败：', error.message);
        process.exit(1); // 初始化失败则退出程序
    }
}

// --------------------------
// 5. CRUD 操作封装
// --------------------------
const UserCRUD = {
    /**
     * 新增用户（Create）
     * @param {Object} userData 包含 username, age, email 等字段的对象
     * @returns {Promise<Object>} 新增的用户记录
     */
    createUser: async (userData) => {
        try {
            const user = await User.create(userData);
            console.log('✅ 新增用户成功：', { id: user.id, username: user.username });
            return user;
        } catch (error) {
            console.error('❌ 新增用户失败：', error.message);
            return null;
        }
    },

    /**
     * 查询用户（Read）
     * @param {number} id 用户 ID
     * @returns {Promise<Object|null>} 用户记录（不存在则返回 null）
     */
    getUserById: async (id) => {
        try {
            const user = await User.findByPk(id);
            if (user) {
                console.log(`✅ 查询到 ID=${id} 的用户：`, { username: user.username, email: user.email });
            } else {
                console.log(`⚠️ 未找到 ID=${id} 的用户`);
            }
            return user;
        } catch (error) {
            console.error('❌ 查询用户失败：', error.message);
            return null;
        }
    },

    /**
     * 查询所有用户（支持分页）
     * @param {number} page 页码（默认 1）
     * @param {number} limit 每页条数（默认 10）
     * @returns {Promise<Array>} 用户列表
     */
    getAllUsers: async (page = 1, limit = 10) => {
        try {
            const offset = (page - 1) * limit;
            const { count, rows } = await User.findAndCountAll({
                where: { status: 1 }, // 只查询状态正常的用户
                limit,
                offset,
                order: [['created_at', 'DESC']] // 按创建时间倒序
            });

            console.log(`✅ 共查询到 ${count} 个用户（第 ${page} 页，每页 ${limit} 条）`);
            return { total: count, list: rows };
        } catch (error) {
            console.error('❌ 查询用户列表失败：', error.message);
            return { total: 0, list: [] };
        }
    },

    /**
     * 更新用户（Update）
     * @param {number} id 用户 ID
     * @param {Object} updateData 要更新的字段（如 { age: 20, email: 'new@xxx.com' }）
     * @returns {Promise<boolean>} 更新是否成功
     */
    updateUser: async (id, updateData) => {
        try {
            const [affectedRows] = await User.update(updateData, {
                where: { id }
            });

            if (affectedRows > 0) {
                console.log(`✅ 更新 ID=${id} 的用户成功`);
                return true;
            } else {
                console.log(`⚠️ 未找到 ID=${id} 的用户，更新失败`);
                return false;
            }
        } catch (error) {
            console.error(`❌ 更新 ID=${id} 的用户失败：`, error.message);
            return false;
        }
    },

    /**
     * 删除用户（Delete）- 软删除
     * @param {number} id 用户 ID
     * @returns {Promise<boolean>} 删除是否成功
     */
    deleteUser: async (id) => {
        try {
            const affectedRows = await User.destroy({
                where: { id }
            });

            if (affectedRows > 0) {
                console.log(`✅ 删除 ID=${id} 的用户成功（软删除）`);
                return true;
            } else {
                console.log(`⚠️ 未找到 ID=${id} 的用户，删除失败`);
                return false;
            }
        } catch (error) {
            console.error(`❌ 删除 ID=${id} 的用户失败：`, error.message);
            return false;
        }
    }
};

// --------------------------
// 6. 测试 CRUD 操作
// --------------------------
async function testCRUD() {
    // 1. 新增测试用户
    const newUser = await UserCRUD.createUser({
        username: `test_user_${Date.now().toString().slice(-4)}`, // 生成唯一用户名
        age: 25,
        email: `test_${Date.now()}@example.com`
    });
    if (!newUser) return; // 新增失败则停止后续测试

    const userId = newUser.id; // 获取新增用户的 ID

    // 2. 查询刚新增的用户
    await UserCRUD.getUserById(userId);

    // 3. 更新用户信息
    await UserCRUD.updateUser(userId, {
        age: 26,
        email: `updated_${Date.now()}@example.com`
    });

    // 4. 查询所有用户（分页）
    await UserCRUD.getAllUsers(1, 5);

    // 5. 删除用户（软删除）
    await UserCRUD.deleteUser(userId);

    // 6. 验证删除结果（查询已删除的用户，应返回 null）
    await UserCRUD.getUserById(userId);
}

// --------------------------
// 7. 执行流程
// --------------------------
(async () => {
    await initDB();       // 初始化数据库
    await testCRUD();     // 测试 CRUD 操作
    await sequelize.close(); // 关闭数据库连接
    console.log('\n📌 所有操作完成，数据库连接已关闭');
})();